package com.huika.dealontop.control.base.extend;

import android.content.Context;
import android.view.View;

/**
 * Author: Victor Wu<br/>
 * Email: victor-wu*foxmail.com<br/>
 * Time: 2015/11/13 11:35<br/>
 * Description:
 * MVC中的 C，用来控制视图和数据，对视图和数据进行合理的显示
 */
public abstract class BaseViewHolder<T> {
    //根View
    protected View mRootView;
    //要显示的数据
    protected T mData;

    protected Context mContext;

    public BaseViewHolder(Context context) {

        this.mContext = context;

        mRootView = initView();

        assignView(mRootView);

        // 打标记
        mRootView.setTag(this);
    }

    public BaseViewHolder(Context context, View rootView) {

        this.mContext = context;

        mRootView = rootView;

        assignView(mRootView);

        // 打标记
        mRootView.setTag(this);
    }

    protected void assignView(View rootView){}

    protected View findViewById(int id){
        return mRootView.findViewById(id);
    }

    /**
     * 初始化View <br/>
     * 当使用{@link com.huika.dealontop.control.base.extend.BaseViewHolder#BaseViewHolder(android.content.Context)} 单参构造方法创建对象时，
     * 必须实现该方法，并返回需要相应的view
     *
     * @return
     */
    protected abstract View initView();

    /**
     * 刷新数据显示
     *
     * @param data
     */
    protected abstract void refreshView(T data);

    /**
     * 刷新数据显示
     *
     * @param data
     * @param position 下标
     */
    protected void refreshView(T data, int position) {
        refreshView(data);
    }

    /**
     * 设置要显示的数据
     *
     * @param data
     */
    public void setData(T data) {
        this.mData = data;

        // UI刷新
        refreshView(mData);
    }

    /**
     * 设置要显示的数据
     *
     * @param data
     * @param position 下标 可以用来绑定AdapterView中item对应的position,
     */
    public void setData(T data, int position) {
        this.mData = data;
        // UI刷新
        refreshView(mData, position);
    }

    /**
     * 获取holder的根View
     *
     * @return
     */
    public View getRootView() {
        return mRootView;
    }

    public void onDestroy() {

    }
}
